package com.hliushi.learn.controller;

import com.hliushi.learn.bean.Person;
import com.hliushi.learn.response.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import javax.validation.constraints.Max;
import javax.validation.constraints.Size;

/**
 * 数据校验
 *
 * @author llhuang10
 */
@Slf4j
@Validated      // 这个注解可以告诉Spring去校验方法参数, 校验请求参数(Path Variables和Request Parameters)一定不能忘记
@RestController
@RequestMapping("/data/verify")
public class DataVerifyController {


    /**
     * 验证请求体(RequestBody)
     * 我们需要验证的参数上加上@Vaild注解, 如果验证失败, 它将抛出MethodArgumentNotValidException
     * 默认情况下, Spring会将次异常转换为HTTP Status 400(错误请求)
     *
     * @param
     * @return
     */
    @PostMapping("/person")
    public JsonResult<Person> getPerson(@RequestBody @Valid Person person) {
        // {
        //   "classId": "0001",
        //   "name": "hliushi",
        //   "sex": "Man",
        //   "email": "demoData"  org.springframework.web.bind.MethodArgumentNotValidException
        // }
        // default message [email 格式不正确]]

        // {
        //   "classId": "0001",
        //   "name": "hliushi",
        //   "sex": "Sex",              // default message [sex 值不在可选范围内]]
        //   "email": "demoData@123"
        // }
        //

        // {
        //   "classId": "0001",
        //   "name": "hliushi",
        //   "sex": "",                 //  default message [sex 值不在可选范围内]]
        //   "email": "demoData@123"
        // }

        // {
        //   "classId": null,           //  default message [classId 不能为空]]
        //   "name": "hliushi",
        //   "sex": "Man",
        //   "email": "demoData@123"
        // }

        // 时间: 2021年7月16日16:09:10   给Person新添加了phone字段, 并且使用了@Phone对该字段进行校验
        // {
        //   "classId": "00001",
        //   "name": "hliushi",
        //   "sex": "Man",
        //   "email": "demoData@123",
        //   "phone":" 110"                 // default message [{bp.validation.phone.message}]]
        // }
        // org.springframework.web.bind.MethodArgumentNotValidException


        log.info("person = {}", person);
        return new JsonResult<>(person);
    }


    /**
     * @param
     * @return
     */
    @GetMapping("/person/{id}")
    public JsonResult<Integer> getPersonById(@PathVariable @Valid
                                             @Max(value = 5, message = "超出Id的范围了") Integer id) {

        // http://localhost:8001/data/verify/person/5
        // {
        //   "data": 5,
        //   "code": "0",
        //   "msg": "success"
        // }

        // http://localhost:8001/data/verify/person/6
        // javax.validation.ConstraintViolationException: getPersonById.id: 超出Id的范围了
        return new JsonResult<>(id);
    }


    /**
     * @param
     * @return
     */
    @GetMapping("/person")
    public JsonResult<String> getPersonByName(@RequestParam @Valid
                                              @Size(max = 6, message = "超出name长度的范围了") String name) {
        // http://localhost:8001/data/verify/person?name=lisi
        // {
        //     "data": "lisi",
        //     "code": "0",
        //     "msg": "success"
        // }

        // http://localhost:8001/data/verify/person?name=liushi
        // {
        //     "data": "liushi",
        //     "code": "0",
        //     "msg": "success"
        // }

        // http://localhost:8001/data/verify/person?name=hliushi
        // javax.validation.ConstraintViolationException: getPersonByName.name: 超出name长度的范围了
        return new JsonResult<>(name);
    }


    @GetMapping("/get/person")
    public String getPersonBean(@Valid Person person) {
        log.info("person {}", person);
        return "get success";
    }

}
